package com.ssm.design.chain.handler.v4;

import com.ssm.design.chain.OrderHandlerChainV3;
import com.ssm.design.chain.OrderHandlerChainV4;
import com.ssm.design.chain.context.OrderHandleContextV3;
import com.ssm.design.common.enums.OrderTypeEnum;

import java.util.Objects;

@FunctionalInterface
public interface OrderHandlerV4 {

    /**
     * 区分类型
     *
     * @return
     */
    default OrderTypeEnum getTypeEnum() {
        return null;
    }

    /**
     * 我是否愿意处理
     *
     * @param context
     * @return
     */
    default boolean isThisNodeDeal(OrderHandleContextV3 context) {
        return Objects.isNull(getTypeEnum())
                || Objects.equals(context.getTypeEnum(), getTypeEnum());
    }

    /**
     * 核心处理
     *
     * @param context 上下文
     * @param args    拓展参数
     */
    default void handle(OrderHandleContextV3 context,
                        OrderHandlerChainV4 chain, Object... args) {
        // 我是否可以处理
        if (isThisNodeDeal(context)) {
            // 让我来处理
            doHandle(context, args);
        }
        // 我处理完了，交给下家
        chain.handle(context, args);
    }

    /**
     * 具体业务处理
     *
     * @param context
     * @param args
     */
    void doHandle(OrderHandleContextV3 context, Object... args);

}